//守护进程
#pragma once 
#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

using std::string;

int main(const string& cwd = " ") //更改守护进程的工作目录
{
    //一般创建守护进程时，需要忽略一些信号
    signal(SIGCLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);

    pid_t pid = fork();
    if(pid > 0)
    {
        exit(0);
    }//将父进程退出
    setsid();//守护进程

    //3. 更改工作目录
    if(!cwd.empty())
    {
        chdir(cwd.c_str());
    }

    //4. ll /dev/null :读不到任何文件，写不到任何文件——垃圾桶
    int fd = open("/dev/null", O_RDONLY);
    if(fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
        //将0 1 2全部重定向至垃圾桶
    }
}